Goes on: Any property with keyframes
Our house spring, measured from a reference UI animation: a confident move with one soft overshoot. Keyframes become targets.

// Coherent Spring — Coherent Motion Expressions · getcoherent.app/resources
// Keyframes become targets: at each keyframe the property springs to the new value (lively, one soft overshoot).
// Tip: set your keyframes to Hold (Ctrl/Cmd+Alt+H): the spring draws every in-between.
var duration = 0.41; // seconds, how long the move feels
var bounce = 0.37;   // 0 = no overshoot · 0.3 = lively · 0.6 = jelly
function sp(t) {
  if (t <= 0) return 0;
  var w = 2 * Math.PI / duration, z = 1 - bounce;
  if (z > 0.999) return 1 - (1 + w * t) * Math.exp(-w * t);
  var wd = w * Math.sqrt(1 - z * z);
  return 1 - Math.exp(-z * w * t) * (Math.cos(wd * t) + z * w / wd * Math.sin(wd * t));
}
var out = value;
if (numKeys > 1) {
  out = key(1).value;
  for (var k = 2; k <= numKeys; k++) {
    if (time < key(k).time) break;
    out = add(out, mul(sub(key(k).value, key(k - 1).value), sp(time - key(k).time)));
  }
}
out
